package com.jacky.双指针;
import java.util.HashMap;
import java.util.Map;

public class 无重复字符的最长子串_3 {
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) return 0;
        Map<Character, Integer> map = new HashMap();
        char[] chars = s.toCharArray();
        int slow = 0, max = 0;
        for (int fast = 0; fast < chars.length; fast++) {
            char ch = chars[fast];
            if (map.containsKey(ch)) {
                //如果出现重复字符，慢指针跳走到重复字符+1
                slow = Math.max(slow, map.get(ch) + 1);
                //如果出现重复字符，也要设置到map中，下一次再出现重复字符保证慢指针不会跳回去
                map.put(ch, fast);
                //重复的时候，慢指针移动后，也要重新计算下当前无重复字符最大长度
                max = Math.max(max, fast - slow + 1);
            } else {
                map.put(ch, fast);
                max = Math.max(max, fast - slow + 1);
            }
        }
        return max;
    }
}
